package com.coderysh.rabbitmq.model.directconnection;

import com.coderysh.rabbitmq.util.RabbitmqUtil;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author 姚书恒
 * @version 1.0
 * @email yaoshuheng@zjkeyou.com
 * @date 2021-10-26 14:43:05
 * @description: 消费者
 */
public class Consumer {

    /**
     *
     */
    public Connection createRabbitmqConnection() {
        // 创建连接mq的连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 设置连接mq主机
        connectionFactory.setHost("192.168.30.88");
        // 设置端口
        connectionFactory.setPort(5672);
        // 设置连接虚拟主机
        connectionFactory.setVirtualHost("/helloworld");
        // 设置访问虚拟主机的用户名和密码
        connectionFactory.setUsername("helloworld");
        connectionFactory.setPassword("helloworld");

        // 获取连接对象
        Connection connection = null;
        try {
            connection = connectionFactory.newConnection();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
        return connection;
    }

    public void consumptionMessage(Channel channel) {
        // 通道绑定对应的消息队列
        // 参数1：队列名称，不存在时会自动创建
        // 参数2：定义队列的特性，是否要持久化，true代表持久化（当mq服务关闭时，会存到磁盘中，下次重启会不会丢失）队列，false代表不持久化
        // 参数3：是否独占队列，true代表独占队列，相对于本次连接而言，为true则只能通过本次连接进行操作；false代表不独占，可被其他连接操作
        // 参数4：是否在消费完成后（消费完成并断开连接后）当前队列中没有消息时自动删除队列，true 自动删除，false不自动删除，注意：这里是删除队列
        // 参数5：额外付加参数
        try {
            channel.queueDeclare("hello", false, false, false, null);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 消费消息
        // 参数1：消费那个队列的消息
        // 参数2：开启消息的自动确认机制
        // 参数3：消费消息时的回调接口
        try {
            channel.basicConsume("hello", true, new DefaultConsumer(channel) {
                // 最后一个参数:消息队列中取出的消息
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println(Thread.currentThread().getName() + ":" + new String(body));
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        Connection rabbitmqConnection = RabbitmqUtil.connection();
        Channel channel = RabbitmqUtil.createChannel(rabbitmqConnection);
        if (null == channel) {
            return;
        }
        consumer.consumptionMessage(channel);
    }
}
